package com.qfjy.common.utils.common.utils.redis;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @ClassName RedisRepeatUtils
 * @Description TODO 高并发（重复提交） 解决方案
 * @Author guoweixin
 * @Date 2022/10/8
 * @Version 1.0
 */
@Component
@Slf4j
public class RedisRepeatUtils {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    /** Redis 过期时间KEY （重复提交）*/
    private static long REPEATED_TOKEN_EXPIRE_MINUTES=30;

    /**
     * TODO 生成token repeated generate
     * 一、进入添加页面
     *   1、生成Redis  token唯一标识值
     *      存到Redis库中，并设置过期时间 30分钟。
     *   2、存到request作用域中
     * @param request
     * @param key  页面路径名称
     */
    public void repeatedGenerateToken(HttpServletRequest request,String key){

        String uuid= UUID.randomUUID().toString();
        redisTemplate.opsForValue().set(key+uuid,uuid,REPEATED_TOKEN_EXPIRE_MINUTES, TimeUnit.MINUTES);
        request.setAttribute("token",uuid);
    }

    /**
     * TODO 校验token repeated check
     * @param request
     * @param key
     */
    public boolean repeatedCheck(HttpServletRequest request,String key){

        //前端传递值
        String token=request.getParameter("token");
        //redis key
         key=key+token;
        String redisValue= (String) redisTemplate.opsForValue().get(key);
        redisTemplate.delete(key);

        if(!token.equals(redisValue)){
            log.error("此次请求是重复提交");
            return false;
        }
        return  true;

    }


}
